package com.ruoyi.file.utils;


import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.PutObjectRequest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.PostConstruct;
import java.io.*;
import java.time.LocalDateTime;
import java.util.UUID;

//@Component
public class OssFileUploadUtils {
    /**
     * Endpoint 存储对象概述  阿里云RAM账号AccessKey，accessKeySecret拥有所有API的访问权限  访问路径前缀  存储对象概述
     */
//    @Value("${oss.endPoint}")
    private static String endPoint ="oss-cn-hangzhou.aliyuncs.com";
    //这里是你的oss节点，对应的外网Endpoint地址，我的是华北2（北京），对应上文
    //官网可查：https://help.aliyun.com/zh/oss/user-guide/regions-and-endpoints

//    @Value("${oss.accessKeyId}")
    private static String accessKeyId = "LTAI5t9yBS13gaKSji2VKzQB";


//    @Value("${oss.accessKeySecret}")
    private static String accessKeySecret = "s5HFONvcaN8eYPOYvPH5kdCjF4Ipbn";
    //这里推荐，创建RAM用户，创建对应的AccessKey，然后直接复制过来就行

//    @Value("${oss.accessPre}")
    private static String accessPre = "https://blindstore.oss-cn-hangzhou.aliyuncs.com/";
    //这个就是你的oss访问前缀，一般就是：https://+ bucket名称.+ endPoint地址；


        /**
     * bucket名称
     * @return
     */
//    @Value("${oss.bucketName}")
    private static String bucketName = "blindstore";
    //这是你的OSS存储，创建的bucket的名称

    private static OSS ossClient ;

    static {
        ossClient = new OSSClientBuilder().build(
                endPoint,
                accessKeyId,
                accessKeySecret);
        System.out.println("oss服务连接成功！");
    }

    /**
     * 默认路径上传本地文件
     * @param filePath
     */
    public static String uploadFile(String filePath){
        return uploadFileForBucket(bucketName,getOssFilePath(filePath) ,filePath);
    }

    /**
     * 默认路径上传multipartFile文件
     * @param multipartFile
     */
    public static String uploadMultipartFile(MultipartFile multipartFile) {
        return uploadMultipartFile(bucketName,getOssFilePath(multipartFile.getOriginalFilename()),multipartFile);
    }
    /**
     * 上传 multipartFile 类型文件
     * @param bucketName
     * @param ossPath
     * @param multipartFile
     */
    public static String uploadMultipartFile(String bucketName , String ossPath , MultipartFile multipartFile){
        InputStream inputStream = null;
        try {
            inputStream = multipartFile.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        uploadFileInputStreamForBucket(bucketName, ossPath, inputStream);
        return accessPre+ossPath;
        //这是返回的图片路径，我们要用这个
//        return ossPath;
    }

    /**
     * 使用File上传PutObject上传文件 ** 程序默认使用次方法上传
     * @param bucketName 实例名称
     * @param ossPath oss存储路径
     * @param filePath 本地文件路径
     */
    public static String uploadFileForBucket(String bucketName , String ossPath , String filePath) {
        // 创建PutObjectRequest对象。
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, ossPath, new File(filePath));

        // 上传
        ossClient.putObject(putObjectRequest);
        return accessPre+ossPath;
//        return ossPath;
    }

    /**
     * 使用文件流上传到指定的bucket实例
     * @param bucketName 实例名称
     * @param ossPath oss存储路径
     * @param filePath 本地文件路径
     */
    public static String uploadFileInputStreamForBucket(String bucketName , String ossPath , String filePath){

        // 填写本地文件的完整路径。如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件流。
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(filePath);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        // 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。
        uploadFileInputStreamForBucket(bucketName, ossPath, inputStream);
        return accessPre+ossPath;
//        return ossPath;
    }

    public static void uploadFileInputStreamForBucket(String bucketName , String ossPath , InputStream inputStream ){
        ossClient.putObject(bucketName, ossPath, inputStream);
    }

    /**
     * 下载
     * @param ossFilePath
     * @param filePath
     */
    public static void downloadFile(String ossFilePath , String filePath ){
        downloadFileForBucket(bucketName , ossFilePath , filePath);
    }
    /**
     * 下载
     * @param bucketName 实例名称
     * @param ossFilePath oss存储路径
     * @param filePath 本地文件路径
     */
    public static void downloadFileForBucket(String bucketName , String ossFilePath , String filePath ){
        ossClient.getObject(new GetObjectRequest(bucketName, ossFilePath), new File(filePath));
    }

    /**
     *
     * @return
     */
    public static String getOssDefaultPath(){
        LocalDateTime now = LocalDateTime.now();
        String url =
                now.getYear()+"/"+
                        now.getMonth()+"/"+
                        now.getDayOfMonth()+"/"+
                        now.getHour()+"/"+
                        now.getMinute()+"/";
        return url;
    }

    public static String getOssFilePath(String filePath){
        String fileSuf = filePath.substring(filePath.indexOf(".") + 1);
        return getOssDefaultPath() + UUID.randomUUID().toString() + "." + fileSuf;
    }



}
